Show / Hide Table of Contents

简介

实体仓库是领域驱动设计中的重要概念,它的作用是管理实体,持久化并保存所有实体。实体的所有状态变更,都需要保存到仓库中去,包括新加实体、删除现有实体、修改实体的状态。同时,要获取任意一个实体,也需要通过实体仓库。

关于 DDD 的概念,参考: [Rafy 与经典 DDD 的关系](../领域实体框架\其它\Rafy 与经典 DDD 的关系.html)。

仓库类型

仓库类型代码示例如下:

/// <summary>
/// 仓库 仓库类。
/// 负责 仓库 类的查询、保存。
/// </summary>
public partial class WarehouseRepository : EntityRepository
{
    /// <summary>
    /// 单例模式,外界不可以直接构造本对象。
    /// </summary>
    protected WarehouseRepository() { }
}

仓库类型有以下特点:

  • 每个实体都对应一个仓库类型。
  • 仓库类型必须遵守以下命名约定:仓库类型名称 = 实体类型名称 + "Repository"。
  • 仓库类型必须直接或间接继承自 EntityRepository 类型。
  • 实体仓库,被设计为单例模式。
    即每个实体的仓库,在整个系统中只有唯一一个运行时对象。仓库类型的构建函数不能公开,通过仓库工厂来获取仓库对象。

仓库外观 Api

由于仓库是单例的,在整个系统运行时只会存在一个仓库的实例。所以我们需要通过仓库工厂来获取唯一的这个仓库对象。 类型是仓库相关的外观 Api,全称是 RepositoryFacade,其中包含了仓库工厂的 Api。(仓库外观 Api 的使用频率比较大,所以使用拼音缩写。另外,如果使用中觉得缩写不方便,框架提供了同样功能、全称的 RepositoryFacade 类型。)
我们可以通过该类的以下两个方法来获取指定的仓库对象:

  • 直接通过指定的仓库类型来获取其运行时仓库对象:
    public static TRepository ResolveInstance() where TRepository : EntityRepository
  • 通过实体类型来获取其唯一的仓库:
    public static EntityRepository Find(Type entityType)
    建议通过 ResolveInstance 方法获取仓库,该方法经过优化,速度比方法要快许多。
CarRepository carRepo = RF.ResolveInstance<CarRepository>();
  • Improve this Doc
In This Article
Back to top 有问题请联系 9474649@qq.com。